# !/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
===========================
@Time : 2022/10/3 0003 9:44
@Author : 测试开发工程师
@File : 31. cookie, session, token 的区别.py
@Software: PyCharm
============================
"""

# ============================================= session cookie token 区别 ==============================================
"""
session: 数据存储到服务端，只把关联数据的一个加密串放到 cookie 中标记
cookie: 浏览器接受服务器的 set_cookie 指令，并把 cookie 保存到电脑上，每个网站保存的 cookie 只作用于自己的网站
token: 是一个用户请求时携带的请求字段，用于验证身份与权限

session 实现机制：（session 会存在服务器端）
    服务器创建 session 出来后，会把 session id，以 cookie 的形式回写给客户端 浏览器。
    这样，只要客户端的浏览器不关，再去访问服务器时，都会带着 session id。服务器发现客户机浏览器带 session id 过来，
    就会使用内存中与之对应的 session 为之服务。
    
cookie 实现机制：（cookie 保存在客户端）
    cookie 通过在客户端记录信息确定用户身份
    cookie 由服务器生成，发送给浏览器。
    浏览器把 cookie 以 kv 形式保存到某个目录下的文本文件内，下一次请求 同一网站时会把该 cookie 发送给服务器
       
token 的原理：(token 保存在客户端)
    基于 token 的身份验证是无状态的，我们不将用户信息保存在服务器或 session 中。这解决了在服务端存储信息时的许多问题
    NoSession 意味着你的程序可以根据需要去增减机器，而不用去担心用户是否登录
    基于 token 的身份验证的过程如下：
        用户发送数据请求
        程序验证
        程序返回一个签名的 token 给客户端
        客户端储存 token，并返回数据
    token 通常在 HTTP 的头部发送给服务器
 
 
                 cookie                            session                                       token                     
存储位置            客户端                            服务端                                        客户端
安全性              较差                               较高                                         相对较高
占用服务器资源      消耗少                         访问多时，消耗多                              不占用服务器资源
作用            记录用户状态，辨认身份               同 cookie                               减轻服务器查询数据压力，提供授权和认证功能
优点       易于使用和实现，不需要服务器资源       信息安全，都是存储在服务端               无状态。可扩展和解耦，更好的跨域（跨域资源共享）
缺点              安全性差                        服务器压力大，扩充性不强                  最小的 token 也比 cookie 大，占带宽，性能问题
适用范围     在线订货系统，网站个人化和网站追踪   session 更适用于客户端服务端同一机器   token 更适用于项目级的前后端分离（前后端代码运行在不同服务器上）
    
"""

"""
鉴权方式： token - (具体使用那种方式，依据项目而定)   
        No Auth
        API Key
        Bearer Token（最常用）
        Basic Auth
        
操作： 
    1. 创建登录接口
    2. 在 响应结果 提取 token
    3. 使用 token 
        下一个接口使用，在请求参数 或 请求头 携带 登录接口（服务端返回的 token 值）
        
form 表单请求：  "Content-Type": "application/x-www-form-urlencoded"
json 格式请求：  "Content-Type": "application/json“
文件格式请求：    "Content-Type": "multipart/form-data"
"""
